package com.hsylient.javase.chapter09;

import com.hsylient.javase.common.enmu.Status;
import com.hsylient.javase.common.entity.Employee;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class MapAndFlatMapTest {

    private final List<Employee> employees = Arrays.asList(
            new Employee(1L, "老xx", 73, 12.0, Status.BUSY),
            new Employee(1L, "李四", 23, 12.0, Status.FREE),
            new Employee(1L, "王五", 23, 3454.32, Status.VOCATION),
            new Employee(1L, "狗八", 53, 5454.32, Status.FREE),
            new Employee(1L, "琳九", 63, 6454.32, Status.BUSY),
            new Employee(1L, "赵六", 63, 4454.32, Status.FREE),
            new Employee(1L, "老十", 73, 7454.32, Status.VOCATION),
            new Employee(1L, "老zz", 73, 7454.32, Status.BUSY),
            new Employee(1L, "张三", 13, 1454.32, Status.VOCATION),
            new Employee(1L, "老yy", 73, 7454.32, Status.BUSY)
    );


    @Test
    public void testMap() {
        List<String> collect = employees.stream()
                .map(Employee::getName)
                .distinct()
                .collect(Collectors.toList());
        System.out.println(collect);
    }


    /*
        这一部分是关于flatMap方法的使用，那么我们怎么使用flatMap，flatMap又是什么意思

        1、flatMap最常见的介绍就是把一个集合打平，我在没有理解flatMap的时候，我没有理解的“打平”是什么意思。后来反推过来发现还真的是“打平”
        2、flatMap使用的前提是有一个类似与嵌套集合的被遍历对象
        3、也就是说在第一层循环的时候取出来的元素可以使用.stream的操作                       ·
     */
    public static void main(String[] args) {
        List<List<String>> list = new ArrayList<>();
        List<String> innerList = new ArrayList<>();
        innerList.add("hsylient");
        innerList.add("hsylient2");
        innerList.add("hsylient3");
        innerList.add("hsylient4");
        innerList.add("hsylient5");
        List<String> innerList2 = new ArrayList<>();
        innerList2.add("hsylient");
        innerList2.add("hsylient2");
        innerList2.add("hsylient3");
        innerList2.add("hsylient4");
        innerList2.add("hsylient5");
        List<String> innerList3 = new ArrayList<>();
        innerList3.add("hsylient");
        innerList3.add("hsylient2");
        innerList3.add("hsylient3");
        innerList3.add("hsylient4");
        innerList3.add("hsylient5");
        list.add(innerList);
        list.add(innerList2);
        list.add(innerList3);
        System.out.println(list);

        list.stream()
                .flatMap(Collection::stream)
                .forEach(System.out::println);
    }

    /**
     * flatMap的第一步是将集合中的每个元素想办法转换为stream<T>
     */
    @Test
    public void testFlatMapDealString() {
        List<String> resource = List.of("hello,小明,爱情,流泪", "排队,喝醉,加油", "我,真的,能,学好,java");
        List<String> collect = resource.stream().flatMap(item -> Arrays.stream(item.split(","))).collect(Collectors.toList());
        System.out.println(collect);
    }
}
